HDU 2553 N皇后问题(DFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5171    Accepted Submission(s): 2357


Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

 

 

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 

 

Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

 

Sample Input
1 8 5 0
 

 

Sample Output
1 92 10
 

 

Author
cgf
 

 

Source
 

 

Recommend
lcy
 
搜索水题。。。。不过这题得打表,如果每次都搜索的话会超时。。。
 
 By LFENG
 
#include<stdio.h>
int s[12] = {010021044092352724};
int main()
{
    
int n;
    
while(scanf("%d", &n) != EOF && n)
        printf(
"%d\n", s[n]);
    
return 0;
}
 
 
 

 

 By LFENG
 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n, sum;
int g[12], ti[12];
int check(int cur)
{
    
int i;
    
for(i = 0; i < cur; i++)
        
if(abs(cur - i) == abs(g[cur] - g[i]) || g[i] == g[cur])return 0;
    
return 1;
}
void dfs(int cur)
{
    
int i, next;
    
if(cur == n)
    {
        sum++;
        
return ;
    }
    
for(i = 0; i < n; i++)
    {
        g[cur] = i;
        
if(!check(cur))continue;
        dfs(cur + 
1);
    }
}
int main()
{
    
int num;
    
for(n = 1; n <= 10; n++)
    {
        memset(g, 
0sizeof(g));
        sum = 
0;
        dfs(
0);
        ti[n] = sum;
    }
    
while(scanf("%d", &num) != EOF && num)
        printf(
"%d\n", ti[num]);
    
return 0;
}
posted @ 2013-05-18 00:28  LFENG  阅读(360)  评论(0编辑  收藏  举报